package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.primefaces.event.FileUploadEvent;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.proyeccion.MantProyeccionClienteDetalleService;
import com.sisgesbyte.services.proyeccion.MantProyeccionFfvvDetalleService;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionClienteDetalleBean;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvDetalleBean;

@ManagedBean
@ViewScoped
public class ProcesarArchivoProyeccionClienteMBean implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@EJB
	private MantProyeccionClienteDetalleService mantProyeccionClienteDetalleService;
	@Inject
	private Validaciones validaciones;
	private int numeroErroresRegistro;
	private int numeroRegistrados;
	
	@PostConstruct
	private void init() {

	}
	
	public void subirArchivo(FileUploadEvent event) {

		List sheetData = new ArrayList();
		InputStream fis = null;
		try {
			fis = event.getFile().getInputstream();
			HSSFWorkbook workbook = new HSSFWorkbook(fis);
			HSSFSheet sheet = workbook.getSheetAt(0);
			Iterator rows = sheet.rowIterator();
			while (rows.hasNext()) {
				HSSFRow row = (HSSFRow) rows.next();
				Iterator cells = row.cellIterator();
				List data = new ArrayList();
				while (cells.hasNext()) {
					HSSFCell cell = (HSSFCell) cells.next();
					data.add(cell);
				}
				sheetData.add(data);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fis != null) {
				try {
					fis.close();
					System.out.println("Cerrar archivo");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		showExelData(sheetData);

		FacesMessage message = new FacesMessage("Se subio el ", event.getFile()
				.getFileName()
				+ " Correctamente."
				+ "\n Errores Registro : "
				+ numeroErroresRegistro
				+ "\n Procesador Correctamente : "
				+ numeroRegistrados);
		FacesContext.getCurrentInstance().addMessage(null, message);
	}

	private void showExelData(List sheetData) {
		numeroErroresRegistro = 0;
		numeroRegistrados=0;
		for (int i = 1; i < sheetData.size(); i++) {
			List list = (List) sheetData.get(i);
			if (list.toString().replace("[", "").replace("]", "").length() > 0) {
				String[] fila = null;
				ListaProyeccionClienteDetalleBean proyeccion = new ListaProyeccionClienteDetalleBean();
				try {
					fila = list.toString().replace("[", "").replace("]", "").split(",");
					
					proyeccion.setPeriodoId((int) Math.round(Double.valueOf(validaciones.validarCamposString(fila[0].toString()))));
					proyeccion.setClienteId((int) Math.round(Double.valueOf(validaciones.validarCamposString(fila[1].toString()))));
					proyeccion.setClienteLocalId((int) Math.round(Double.valueOf(validaciones.validarCamposString(fila[2].toString()))));
					proyeccion.setProductoId((int) Math.round(Double.valueOf(validaciones.validarCamposString(fila[3].toString()))));
					proyeccion.setCodigoBanda(validaciones.validarCamposStringSubirArchivos(fila[4].toString()));
					proyeccion.setCantidadProyectada(new BigDecimal(validaciones.validarCamposString(fila[5].toString().replace(",", ""))));

				} catch (Exception e) {
					System.out.println("Error al tratar de leer la fila " + e);
				}
				
				try {
						if(proyeccion.getProductoId() != null){
							if(proyeccion.getProductoId() > 0){
								GenericResponse response = mantProyeccionClienteDetalleService.nuevaProyeccioClienteDetalle(ObtenerIdTransaccion(), proyeccion);
								if (response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)) {
									System.out.println("Se registro correctamente ");
									++numeroRegistrados;
								} else {
									System.out.println("Error Funcional al Tratar de Registrar en BD");
									System.out.println("Cod Respuesta : "+ response.getCodigoRespuesta());
									++numeroErroresRegistro;
								}
							}
						}
				} catch (Exception e) {
					System.out.println("Error Tecnico al tratar de registrar en BD "+ e);
					++numeroErroresRegistro;
				}

			}

		}
	}

	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext()
				.getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}

}
